package com.example.spring.common;


import com.example.spring.utils.PropertiesLoader;
import com.example.spring.utils.StringUtils;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import org.springframework.core.io.DefaultResourceLoader;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Map;

/**
 * 全局配置类
 *
 * @author ThinkGem
 * @version 2014-06-25
 */
public class Global {

    /**
     * 当前对象实例
     */
    private static Global global = new Global();

    /**
     * 保存全局属性值
     */
    private static Map<String, String> map = Maps.newHashMap();


    //系统属性配置文件
    private static final String systemProperties = "application.properties";

    //业务属性配置文件夹名
    private static final String dPath = "properties";

    // 属性文件加载对象
    private static PropertiesLoader loader;


    /**
     * 获取当前对象实例
     */
    public static Global getInstance() {
        return global;
    }

    private Global() {

        //获取放置业务属性配置文件夹全路径
        URL resource = PropertiesLoader.class.getClassLoader().getResource(dPath);
        if (resource != null) {
            String path = resource.getPath();
            File directory = new File(path);
            File[] files = directory.listFiles();
            ArrayList<String> list = new ArrayList<String>();
            int count = 1;
            for (File file1 : files) {
                if (!file1.isDirectory()) {
                    //只加载properties文件
                    if (file1.getName().endsWith(".properties")) {
                        count++;
                        list.add(dPath + "/" + file1.getName());
                    }
                }
            }
            //将业务属性配置文件放置数组中
            String[] properties = new String[count];
            for (int i = 0; i < properties.length - 1; i++) {
                properties[i] = list.get(i);
            }
            //将系统属性配置文件放置数组中
            properties[properties.length - 1] = systemProperties;
            loader = new PropertiesLoader(properties);
        } else {
            loader = new PropertiesLoader(systemProperties);
        }
        // 属性文件加载对象

    }

    /**
     * 获取配置
     *
     * @param key
     * @return
     */
    public static String getConfig(String key) {
        String value = map.get(key);
        if (value == null) {
            value = loader.getProperty(key);
            map.put(key, value != null ? value : StringUtils.EMPTY);
        }
        return value;
    }

    /**
     * 获取管理端根路径
     */
    public static String getAdminPath() {
        return getConfig("adminPath");
    }

    /**
     * 获取前端根路径
     */
    public static String getFrontPath() {
        return getConfig("frontPath");
    }

    /**
     * 获取URL后缀
     */
    public static String getUrlSuffix() {
        return getConfig("urlSuffix");
    }

    /**
     * 是否是演示模式，演示模式下不能修改用户、角色、密码、菜单、授权
     */
    public static Boolean isDemoMode() {
        String dm = getConfig("demoMode");
        return Strings.isNullOrEmpty(dm) || "true".equals(dm) || "1".equals(dm);
    }

    /**
     * 是否支持sso单点登录
     */
    public static Boolean enableSSO() {
        String ssoEnable = getConfig("sso.enable");
        return !("0".equals(ssoEnable) || "false".equals(ssoEnable));
    }

    /**
     * 在修改系统用户和角色时是否同步到Activiti
     */
    public static Boolean isSynActivitiIndetity() {
        String dm = getConfig("activiti.isSynActivitiIndetity");
        return "true".equals(dm) || "1".equals(dm);
    }

    /**
     * 页面获取常量
     *
     * @param field
     * @return
     */
    public static Object getConst(String field) {
        try {
            return Global.class.getField(field).get(null);
        } catch (Exception e) {
            // 异常代表无配置，这里什么也不做
        }
        return null;
    }

    /**
     * 获取上传文件的根目录
     *
     * @return
     */
    public static String getUserfilesBaseDir() {
        String dir = getConfig("userfiles.basedir");
        if (!dir.endsWith("/")) {
            dir += "/";
        }
        return dir;
    }

    /**
     * 获取工程路径
     *
     * @return
     */
    public static String getProjectPath() {
        // 如果配置了工程路径，则直接返回，否则自动获取。
        String projectPath = Global.getConfig("projectPath");
        if (StringUtils.isNotBlank(projectPath)) {
            return projectPath;
        }
        try {
            File file = new DefaultResourceLoader().getResource("").getFile();
            if (file != null) {
                while (true) {
                    File f = new File(file.getPath() + File.separator + "src" + File.separator + "main");
                    if (f == null || f.exists()) {
                        break;
                    }
                    if (file.getParentFile() != null) {
                        file = file.getParentFile();
                    } else {
                        break;
                    }
                }
                projectPath = file.toString();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return projectPath;
    }

    /**
     * 显示/隐藏
     */
    public static final String SHOW = "1";
    public static final String HIDE = "0";

    /**
     * 是/否
     */
    public static final String YES = "1";
    public static final String NO = "0";

    /**
     * 对/错
     */
    public static final String TRUE = "true";
    public static final String FALSE = "false";

    /**
     * 上传文件基础虚拟路径
     */
    public static final String USERFILES_BASE_URL = "/user_files/";

}
